package com.xscr.api.utils;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

public class IpUtil {

    public static String getIpAddrByRequest(HttpServletRequest request) {

        String ip = request.getHeader("x-forwarded-for");

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

            ip = request.getHeader("Proxy-Client-IP");

        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

            ip = request.getHeader("WL-Proxy-Client-IP");

        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

            ip = request.getRemoteAddr();

        }

        return ip;

    }

    
    /**
     * @return 本机IP

     * @throws SocketException

     */

    public static String getRealIp() throws SocketException {

        String localip = null;// 本地IP，如果没有配置外网IP则返回它

        String netip = null;// 外网IP



        Enumeration<NetworkInterface> netInterfaces =

            NetworkInterface.getNetworkInterfaces();

        InetAddress ip = null;

        boolean finded = false;// 是否找到外网IP

        while (netInterfaces.hasMoreElements() && !finded) {

            NetworkInterface ni = netInterfaces.nextElement();

            Enumeration<InetAddress> address = ni.getInetAddresses();

            while (address.hasMoreElements()) {

                ip = address.nextElement();

                if (!ip.isSiteLocalAddress()

                        && !ip.isLoopbackAddress()

                        && ip.getHostAddress().indexOf(":") == -1) {// 外网IP

                    netip = ip.getHostAddress();

                    finded = true;

                    break;

                } else if (ip.isSiteLocalAddress()

                        && !ip.isLoopbackAddress()

                        && ip.getHostAddress().indexOf(":") == -1) {// 内网IP

                    localip = ip.getHostAddress();

                }

            }

        }

    

        if (netip != null && !"".equals(netip)) {

            return netip;

        } else {

            return localip;

        }

    }

    

} 